/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pe.edu.upc.dew.discoteca.dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import pe.edu.upc.dew.discoteca.model.Contacto;
import pe.edu.upc.dew.discoteca.model.Discoteca;
import pe.edu.upc.dew.discoteca.model.Lista;

/**
 *
 * @author elvis
 */
@Repository
public class DiscotecaDAOImpl implements DiscotecaDAO{

    private EntityManager em;

    @PersistenceContext
    public void setEntityManager(EntityManager em) {
	this.em = em;
    }
    @Transactional
    public List<Discoteca> listarDiscotecas() {
        return em.createQuery("from Discoteca").getResultList();
    }
    @Transactional
    public void registrar(Discoteca discoteca) {
        em.persist(discoteca);
    }
    @Transactional
    public void modificar(Discoteca discoteca) {
        em.merge(discoteca);
    }

    public Discoteca buscarDiscoteca(int codigo) {
        return (Discoteca)em.createQuery("from Discoteca where codigo = :cod ").setParameter("cod", codigo)
                .getSingleResult();
    }

    public Discoteca buscarDiscotecaN(String codigo) {
        return (Discoteca)em.createQuery("from Discoteca where nombre = :cod ").setParameter("cod", codigo)
                .getSingleResult();
    }


    @Transactional(propagation=Propagation.MANDATORY)
    public void registraLista(Lista lista) {
        em.persist(lista);
    }

    @Transactional(propagation=Propagation.MANDATORY)
    public void registrarContacto(Contacto contacto) {
        em.persist(contacto);
    }

    public Lista obtenerLista(String codigo) {
        return (Lista)em.createQuery("from Lista where codigo = :cod ")
                .setParameter("cod", Integer.parseInt(codigo))
                .getSingleResult();
    }

    /**
     * Entrega todos lso contactos de una lista
     * @param codigoLista
     * @return
     */
    public List<Contacto> listarContactos(String codigoLista) {
        return em.createQuery("from Contacto where codigoLista.codigo = :cod")
               .setParameter("cod", Integer.parseInt(codigoLista))
               .getResultList();
    }

   public List<Lista> listaReservas(String discoteca, String fecha) {
      return em.createQuery("Select li from Lista li")// join fetch li.contactos //where codigoLista = :cod
             //  .setParameter("cod", codigoLista)
               .getResultList();
   }


}
